package com.example.ywr.service;

import com.example.ywr.common.PageParam;
import com.example.ywr.common.PageResult;
import com.example.ywr.entity.Order;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单服务接口
 */
public interface OrderService {

    /**
     * 创建订单
     *
     * @param order 订单信息
     * @return 创建后的订单信息
     */
    Order create(Order order);

    /**
     * 更新订单
     *
     * @param order 订单信息
     * @return 更新后的订单信息
     */
    Order update(Order order);

    /**
     * 根据ID删除订单
     *
     * @param id 订单ID
     * @return 是否删除成功
     */
    boolean delete(Long id);

    /**
     * 批量删除订单
     *
     * @param ids 订单ID列表
     * @return 是否删除成功
     */
    boolean batchDelete(List<Long> ids);

    /**
     * 根据ID获取订单详情
     *
     * @param id 订单ID
     * @return 订单详情
     */
    Order getById(Long id);

    /**
     * 根据订单编号获取订单详情
     *
     * @param orderNo 订单编号
     * @return 订单详情
     */
    Order getByOrderNo(String orderNo);

    /**
     * 分页查询订单列表
     *
     * @param pageParam 分页参数
     * @return 订单列表
     */
    PageResult<Order> list(PageParam pageParam);

    /**
     * 根据用户ID查询订单
     *
     * @param userId    用户ID
     * @param pageParam 分页参数
     * @return 订单列表
     */
    PageResult<Order> listByUserId(Long userId, PageParam pageParam);

    /**
     * 根据订单状态查询订单
     *
     * @param status    订单状态
     * @param pageParam 分页参数
     * @return 订单列表
     */
    PageResult<Order> listByStatus(Integer status, PageParam pageParam);

    /**
     * 根据用户ID和订单状态查询订单
     *
     * @param userId    用户ID
     * @param status    订单状态
     * @param pageParam 分页参数
     * @return 订单列表
     */
    PageResult<Order> listByUserIdAndStatus(Long userId, Integer status, PageParam pageParam);

    /**
     * 根据创建时间范围查询订单
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pageParam 分页参数
     * @return 订单列表
     */
    PageResult<Order> listByCreateTime(LocalDateTime startTime, LocalDateTime endTime, PageParam pageParam);

    /**
     * 更新订单状态
     *
     * @param id     订单ID
     * @param status 订单状态
     * @return 是否更新成功
     */
    boolean updateStatus(Long id, Integer status);

    /**
     * 批量更新订单状态
     *
     * @param ids    订单ID列表
     * @param status 订单状态
     * @return 是否更新成功
     */
    boolean batchUpdateStatus(List<Long> ids, Integer status);
}